home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / mailbox.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  9KB  |  341 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''Classes to handle Unix style, MMDF style, and MH style mailboxes.'''
  5. import rfc822
  6. import os
  7. __all__ = [
  8.     'UnixMailbox',
  9.     'MmdfMailbox',
  10.     'MHMailbox',
  11.     'Maildir',
  12.     'BabylMailbox',
  13.     'PortableUnixMailbox']
  14.  
  15. class _Mailbox:
  16.     
  17.     def __init__(self, fp, factory = rfc822.Message):
  18.         self.fp = fp
  19.         self.seekp = 0
  20.         self.factory = factory
  21.  
  22.     
  23.     def __iter__(self):
  24.         return iter(self.next, None)
  25.  
  26.     
  27.     def next(self):
  28.         while None:
  29.             
  30.             try:
  31.                 self._search_start()
  32.             except EOFError:
  33.                 self.seekp = self.fp.tell()
  34.                 return None
  35.  
  36.             start = self.fp.tell()
  37.             self._search_end()
  38.             self.seekp = stop = self.fp.tell()
  39.             if start != stop:
  40.                 break
  41.                 continue
  42.         return self.factory(_Subfile(self.fp, start, stop))
  43.  
  44.  
  45.  
  46. class _Subfile:
  47.     
  48.     def __init__(self, fp, start, stop):
  49.         self.fp = fp
  50.         self.start = start
  51.         self.stop = stop
  52.         self.pos = self.start
  53.  
  54.     
  55.     def _read(self, length, read_function):
  56.         if self.pos >= self.stop:
  57.             return ''
  58.         
  59.         remaining = self.stop - self.pos
  60.         if length is None and length < 0 or length > remaining:
  61.             length = remaining
  62.         
  63.         self.fp.seek(self.pos)
  64.         data = read_function(length)
  65.         self.pos = self.fp.tell()
  66.         return data
  67.  
  68.     
  69.     def read(self, length = None):
  70.         return self._read(length, self.fp.read)
  71.  
  72.     
  73.     def readline(self, length = None):
  74.         return self._read(length, self.fp.readline)
  75.  
  76.     
  77.     def readlines(self, sizehint = -1):
  78.         lines = []
  79.         while None:
  80.             line = self.readline()
  81.             if not line:
  82.                 break
  83.             
  84.             if sizehint >= 0:
  85.                 sizehint = sizehint - len(line)
  86.                 if sizehint <= 0:
  87.                     break
  88.                 
  89.             sizehint <= 0
  90.         return lines
  91.  
  92.     
  93.     def tell(self):
  94.         return self.pos - self.start
  95.  
  96.     
  97.     def seek(self, pos, whence = 0):
  98.         if whence == 0:
  99.             self.pos = self.start + pos
  100.         elif whence == 1:
  101.             self.pos = self.pos + pos
  102.         elif whence == 2:
  103.             self.pos = self.stop + pos
  104.         
  105.  
  106.     
  107.     def close(self):
  108.         del self.fp
  109.  
  110.  
  111.  
  112. class UnixMailbox(_Mailbox):
  113.     
  114.     def _search_start(self):
  115.         while None:
  116.             pos = self.fp.tell()
  117.             line = self.fp.readline()
  118.             if not line:
  119.                 raise EOFError
  120.             
  121.             if line[:5] == 'From ' and self._isrealfromline(line):
  122.                 self.fp.seek(pos)
  123.                 return None
  124.                 continue
  125.  
  126.     
  127.     def _search_end(self):
  128.         self.fp.readline()
  129.         while None:
  130.             pos = self.fp.tell()
  131.             line = self.fp.readline()
  132.             if not line:
  133.                 return None
  134.             
  135.             if line[:5] == 'From ' and self._isrealfromline(line):
  136.                 self.fp.seek(pos)
  137.                 return None
  138.                 continue
  139.  
  140.     _fromlinepattern = 'From \\s*[^\\s]+\\s+\\w\\w\\w\\s+\\w\\w\\w\\s+\\d?\\d\\s+\\d?\\d:\\d\\d(:\\d\\d)?(\\s+[^\\s]+)?\\s+\\d\\d\\d\\d\\s*$'
  141.     _regexp = None
  142.     
  143.     def _strict_isrealfromline(self, line):
  144.         if not self._regexp:
  145.             import re as re
  146.             self._regexp = re.compile(self._fromlinepattern)
  147.         
  148.         return self._regexp.match(line)
  149.  
  150.     
  151.     def _portable_isrealfromline(self, line):
  152.         return True
  153.  
  154.     _isrealfromline = _strict_isrealfromline
  155.  
  156.  
  157. class PortableUnixMailbox(UnixMailbox):
  158.     _isrealfromline = UnixMailbox._portable_isrealfromline
  159.  
  160.  
  161. class MmdfMailbox(_Mailbox):
  162.     
  163.     def _search_start(self):
  164.         while None:
  165.             line = self.fp.readline()
  166.             if not line:
  167.                 raise EOFError
  168.             
  169.             if line[:5] == '\x01\x01\x01\x01\n':
  170.                 return None
  171.                 continue
  172.  
  173.     
  174.     def _search_end(self):
  175.         while None:
  176.             pos = self.fp.tell()
  177.             line = self.fp.readline()
  178.             if not line:
  179.                 return None
  180.             
  181.             if line == '\x01\x01\x01\x01\n':
  182.                 self.fp.seek(pos)
  183.                 return None
  184.                 continue
  185.  
  186.  
  187.  
  188. class MHMailbox:
  189.     
  190.     def __init__(self, dirname, factory = rfc822.Message):
  191.         import re
  192.         pat = re.compile('^[1-9][0-9]*$')
  193.         self.dirname = dirname
  194.         list = os.listdir(self.dirname)
  195.         list = filter(pat.match, list)
  196.         list = map(long, list)
  197.         list.sort()
  198.         self.boxes = map(str, list)
  199.         self.boxes.reverse()
  200.         self.factory = factory
  201.  
  202.     
  203.     def __iter__(self):
  204.         return iter(self.next, None)
  205.  
  206.     
  207.     def next(self):
  208.         if not self.boxes:
  209.             return None
  210.         
  211.         fn = self.boxes.pop()
  212.         fp = open(os.path.join(self.dirname, fn))
  213.         msg = self.factory(fp)
  214.         
  215.         try:
  216.             msg._mh_msgno = fn
  217.         except (AttributeError, TypeError):
  218.             pass
  219.  
  220.         return msg
  221.  
  222.  
  223.  
  224. class Maildir:
  225.     
  226.     def __init__(self, dirname, factory = rfc822.Message):
  227.         self.dirname = dirname
  228.         self.factory = factory
  229.         newdir = os.path.join(self.dirname, 'new')
  230.         boxes = _[1]
  231.         curdir = os.path.join(self.dirname, 'cur')
  232.         [] += _[1]
  233.         boxes.reverse()
  234.         self.boxes = boxes
  235.  
  236.     
  237.     def __iter__(self):
  238.         return iter(self.next, None)
  239.  
  240.     
  241.     def next(self):
  242.         if not self.boxes:
  243.             return None
  244.         
  245.         fn = self.boxes.pop()
  246.         fp = open(fn)
  247.         return self.factory(fp)
  248.  
  249.  
  250.  
  251. class BabylMailbox(_Mailbox):
  252.     
  253.     def _search_start(self):
  254.         while None:
  255.             line = self.fp.readline()
  256.             if not line:
  257.                 raise EOFError
  258.             
  259.             if line == '*** EOOH ***\n':
  260.                 return None
  261.                 continue
  262.  
  263.     
  264.     def _search_end(self):
  265.         while None:
  266.             pos = self.fp.tell()
  267.             line = self.fp.readline()
  268.             if not line:
  269.                 return None
  270.             
  271.             if line == '\x1f\x0c\n' or line == '\x1f':
  272.                 self.fp.seek(pos)
  273.                 return None
  274.                 continue
  275.  
  276.  
  277.  
  278. def _test():
  279.     import sys as sys
  280.     args = sys.argv[1:]
  281.     if not args:
  282.         for key in ('MAILDIR', 'MAIL', 'LOGNAME', 'USER'):
  283.             if key in os.environ:
  284.                 mbox = os.environ[key]
  285.                 break
  286.                 continue
  287.         else:
  288.             print '$MAIL, $LOGNAME nor $USER set -- who are you?'
  289.             return None
  290.     else:
  291.         mbox = args[0]
  292.     if mbox[:1] == '+':
  293.         mbox = os.environ['HOME'] + '/Mail/' + mbox[1:]
  294.     elif '/' not in mbox:
  295.         if os.path.isfile('/var/mail/' + mbox):
  296.             mbox = '/var/mail/' + mbox
  297.         else:
  298.             mbox = '/usr/mail/' + mbox
  299.     
  300.     if os.path.isdir(mbox):
  301.         if os.path.isdir(os.path.join(mbox, 'cur')):
  302.             mb = Maildir(mbox)
  303.         else:
  304.             mb = MHMailbox(mbox)
  305.     else:
  306.         fp = open(mbox, 'r')
  307.         mb = PortableUnixMailbox(fp)
  308.     msgs = []
  309.     while None:
  310.         msg = mb.next()
  311.         if msg is None:
  312.             break
  313.         
  314.         if len(args) <= 1:
  315.             msg.fp = None
  316.             continue
  317.     if len(args) > 1:
  318.         num = int(args[1])
  319.         print 'Message %d body:' % num
  320.         msg = msgs[num - 1]
  321.         msg.rewindbody()
  322.         sys.stdout.write(msg.fp.read())
  323.     else:
  324.         print 'Mailbox', mbox, 'has', len(msgs), 'messages:'
  325.         for msg in msgs:
  326.             if not msg.getheader('from'):
  327.                 pass
  328.             f = ''
  329.             if not msg.getheader('subject'):
  330.                 pass
  331.             s = ''
  332.             if not msg.getheader('date'):
  333.                 pass
  334.             d = ''
  335.             print '-%20.20s   %20.20s   %-30.30s' % (f, d[5:], s)
  336.         
  337.  
  338. if __name__ == '__main__':
  339.     _test()
  340.  
  341.